import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import random  # 导入随机模块

# 设置matplotlib使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 替换为您系统中安装的中文字体，例如 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False    # 解决负号 '-' 显示为方块的问题

# 定义至少五十句夸奖语句
compliments = [
    "您的手相显示出您拥有坚强的意志力和不屈的精神。",
    "智慧线深长，预示着您拥有出色的智慧和卓越的思维能力。",
    "感情线柔和，说明您是一个温柔体贴、情感丰富的人。",
    "命运线明显，表明您的生活中充满了机遇和成功。",
    "健康线清晰，预示着您身体健康，充满活力。",
    "爱情线长而直，说明您在感情方面非常专一和稳定。",
    "财帛线坚实，预示着您在财务管理方面有很好的能力。",
    "行运线顺畅，表明您的事业发展顺利，前途光明。",
    "婚姻线深刻，说明您的婚姻生活幸福美满。",
    "婴儿线明显，预示着您有良好的家庭背景和早期教育。",
    "事业线发达，表明您在职业生涯中会有显著的成就。",
    "生命线延展，预示着您的人生充满活力和持久的健康。",
    "太阳线明亮，说明您有艺术天赋和创造力。",
    "金星线清晰，预示着您的人际关系和社交能力很强。",
    "地线稳定，表明您脚踏实地，务实可靠。",
    "太阳线延展，说明您在事业上会有很大的发展空间。",
    "行动线发达，预示着您行动力强，能够快速实现目标。",
    "幸运线明显，说明您会在生活中遇到许多好运。",
    "生命线坚实，预示着您有坚强的生命力和健康的体魄。",
    "生命线曲线优美，说明您拥有良好的人际关系和家庭生活。",
    "智慧线宽广，表明您思维敏捷，学习能力强。",
    "感情线多分支，预示着您情感丰富，生活多彩。",
    "财帛线直而长，说明您在财富积累上会有丰厚的收获。",
    "命运线深刻，表明您的人生道路清晰，有明确的目标。",
    "事业线清晰，预示着您在职业上会有明确的发展方向。",
    "感情线顺畅，说明您在人际关系中会非常顺利和谐。",
    "太阳线发达，预示着您有艺术或创造方面的天赋。",
    "生命线广阔，说明您的生活充满了多样性和丰富的经历。",
    "智慧线清晰，表明您有很高的智慧和逻辑思维能力。",
    "命运线延伸，预示着您的事业和生活会有长远的发展。",
    "感情线深长，说明您对感情忠诚，情感深厚。",
    "财帛线明显，预示着您在财务方面非常有天赋和能力。",
    "健康线强劲，表明您拥有良好的健康状况和活力。",
    "太阳线直，说明您有明确的目标和方向。",
    "行运线清晰，预示着您的生活和事业将顺利前行。",
    "生命线曲折，说明您有克服困难的能力和坚韧不拔的精神。",
    "命运线宽广，表明您的人生道路多样，充满机遇。",
    "智慧线发达，预示着您在学术或专业领域会有所成就。",
    "感情线平稳，说明您的感情生活稳定，幸福美满。",
    "财帛线发达，表明您在财富积累上非常成功。",
    "健康线清晰，预示着您拥有良好的身体素质和健康的生活方式。",
    "行运线顺畅，说明您的事业和生活将会一路顺风。",
    "命运线直，预示着您有明确的目标和坚定的信念。",
    "生命线深长，说明您的生命力旺盛，能够应对各种挑战。",
    "智慧线曲折，表明您有独特的思维方式和创新能力。",
    "感情线发达，预示着您在人际关系中非常有魅力和影响力。",
    "财帛线坚实，说明您有很强的财务管理能力和财富积累能力。",
    "太阳线明显，预示着您有很高的艺术天赋和创造力。",
    "命运线清晰，表明您的生活有明确的方向和目标。",
    "感情线宽广，说明您心胸宽广，善于处理各种人际关系。",
    "事业线直而明显，预示着您在职业生涯中会有突出的表现。",
    "您的手相透露出非凡的才智与无限的潜能，祝福您的未来充满光明与成功！"
]

def process_palm_image(image_path):
    """
    对手相图片进行预处理并提取手掌线条和中心点
    """
    # 检查文件是否存在
    if not os.path.isfile(image_path):
        print("无法加载图片，请检查路径！")
        return None, None, None

    # 读取图片
    image = cv2.imread(image_path)
    if image is None:
        print("无法加载图片，请检查路径！")
        return None, None, None

    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 高斯模糊（减少噪声）
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    # 自适应阈值
    thresh = cv2.adaptiveThreshold(
        blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY_INV, 11, 2
    )

    # 形态学操作（膨胀）
    kernel = np.ones((3, 3), np.uint8)
    dilated = cv2.dilate(thresh, kernel, iterations=2)

    # 查找轮廓
    contours, _ = cv2.findContours(
        dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
    )

    if not contours:
        print("未检测到手掌轮廓，请尝试更清晰的手相图片！")
        return image, None, None

    # 假设最大的轮廓是手掌
    hand_contour = max(contours, key=cv2.contourArea)

    # 计算手掌的质心
    M = cv2.moments(hand_contour)
    if M["m00"] == 0:
        print("无法计算手掌的质心！")
        return image, None, None
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])

    # 在原图上绘制手掌轮廓和中心点
    output = image.copy()
    cv2.drawContours(output, [hand_contour], -1, (0, 255, 0), 2)  # 绿色轮廓
    cv2.circle(output, (cX, cY), 7, (255, 0, 0), -1)  # 蓝色中心点

    # 创建叠加图像：将红色线条叠加到原始图像上
    # 1. 将 thresh 转换为彩色图像
    thresh_color = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)

    # 2. 将白色线条设为红色
    thresh_color[np.where((thresh_color == [255, 255, 255]).all(axis=2))] = [0, 0, 255]  # 红色线条 (BGR)

    # 3. 叠加图像（调整透明度可以改变线条的显著程度）
    overlay = cv2.addWeighted(image, 1.0, thresh_color, 0.5, 0)

    # 随机选择一句夸奖语句
    compliment = random.choice(compliments)

    # 返回原始图像、叠加图像和质心
    return image, overlay, (cX, cY), compliment

def main():
    # 替换为您的手相图片路径
    image_path = "test2.jpg"  # 请确保图片存在于此路径
    image, overlay, center, compliment = process_palm_image(image_path)

    if image is not None and overlay is not None:
        # 创建一个画板，展示原始图片和叠加后的图片
        plt.figure(figsize=(12, 6))

        # 显示原始图片
        plt.subplot(1, 2, 1)
        plt.title("原始图片")
        plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
        plt.axis("off")

        # 显示叠加后的图片
        plt.subplot(1, 2, 2)
        plt.title("手相识别图")
        plt.imshow(cv2.cvtColor(overlay, cv2.COLOR_BGR2RGB))
        plt.axis("off")

        # 添加全局标题或注释（随机选择的夸奖语句）
        plt.suptitle(compliment, fontsize=14, color='blue')

        # 调整布局以适应全局标题
        plt.tight_layout(rect=[0, 0.03, 1, 0.95])  # 左, 下, 右, 上

        plt.show()

    # 可选：保存叠加后的图像
    # if overlay is not None:
    #     cv2.imwrite("filtered_hand_overlay.png", overlay)
    #     print("过滤背景并叠加线条后的手掌图像已保存为 filtered_hand_overlay.png")

if __name__ == "__main__":
    main()
